package com.itany.shop.service.impl;

import com.itany.shop.dao.ProductDao;
import com.itany.shop.entity.Item;
import com.itany.shop.entity.Product;
import com.itany.shop.exception.ProductNotExistException;
import com.itany.shop.exception.RequestParameterErrorException;
import com.itany.shop.exception.UserNotExistException;
import com.itany.shop.exception.UserNotLoginException;
import com.itany.shop.factory.ObjectFactory;
import com.itany.shop.service.CartService;
import com.itany.shop.vo.Cart;

import java.util.List;

/**
 * @author Miss Chen
 * @version 1.0
 * @date 2024年08月15日15:23
 */
public class CartServiceImpl implements CartService {
    private ProductDao productDao= (ProductDao) ObjectFactory.getObject("productDao");
    @Override
    public void addCart(Cart cart, Integer id) throws RequestParameterErrorException, ProductNotExistException, UserNotLoginException {
        if(null==cart){
            throw new UserNotLoginException("请先登录");
        }
        if(id==null){
            throw new RequestParameterErrorException("请求参数有误");
        }
        //由于商品的价格是浮动的，可能会发生变化
        //当加入购物车的商品价格与已经存在于购物车中同一个商品的价格可能不一样
        // 此时我们只考虑新加入购物车的商品价格的变化，使用最新的价格展示购物车数据
        // 进行二次查询

        //根据购物车商品编号，查询最新商品信息
        Product product=productDao.selectById(id);
        if(product==null){
            throw new ProductNotExistException("该编号对应的商品不存在，请检查编号是否正确");
        }

        //加入购物车有2种情况
        // 1.当前购物车中已经存在对应商品
        // 2.当前购物车中尚未存在对应的商品
        // 根据当前购物车中明细信息，判断加入购物车的商品是否已经存在
        List<Item> itmes=cart.getItems();
        //遍历明细信息
        for(Item item:itmes){
            //如果当前明细中的商品主键与加入购物车中的商品主键一致，表示商品已经存在
            if(item.getProduct().getId().equals(product.getId())){
                // 购物车中会发生什么变化？
                // 1.明细数量=原来数量+1
                item.setNum(item.getNum()+1);

                //获取原来的明细总价
                Double oldPrice=item.getPrice();

                // 2.明细总价=当前明细数量*商品单价
                item.setPrice(item.getNum()*product.getPrice());

                //获取现在的明细总价
                Double newPrice=item.getPrice();

                // 3.购物车总价=原来的购物车总价-原来的明细总价+现在的明细总价
                cart.setPrice(cart.getPrice()-oldPrice+newPrice);
                return;
            }
        }

        //如果明细中不存在对应的商品，那么购物车有哪些变化???
        Item item=new Item();

        //新增的明细数量为1
        item.setNum(1);

        //当前商品明细总价=商品价格
        item.setPrice(product.getPrice());

        //新增的商品就是当前商品
        item.setProduct(product);

        //将新增的明细添加到购物车中
        cart.addItem(item);

        // 购物车总价=原来的价格+明细的总价
        cart.setPrice(cart.getPrice()+item.getPrice());


    }

    @Override
    public void removeCart(Cart cart, Integer id) throws RequestParameterErrorException, UserNotLoginException {
        if(cart==null){
            throw new UserNotLoginException("请先登录");
        }
        if(id==null){
            throw new RequestParameterErrorException("请求参数有问题");
        }
        //找到需要删除的明细是哪一个
        List<Item> items=cart.getItems();
        for(int i=0;i<items.size();i++){
            //取出迭代的元素
            Item item=items.get(i);

            //判断该元素是否是需要被删除的明细
            if(item.getProduct().getId().equals(id)){
                //购物有啥变化？？？
                // 1.购物车总价=原来的总价-当前明细总价
                cart.setPrice(cart.getPrice()-item.getPrice());

                // 2.移除购物车中指定明细
                cart.removeItem(item);
            }
        }

    }


    @Override
    public void modifyCart(Cart cart, Integer id, Integer num) throws RequestParameterErrorException, UserNotLoginException {
        if(cart==null){
            throw new UserNotLoginException("请先登录");
        }
        if(id==null || num==null ){
            throw new RequestParameterErrorException("请求参数有问题");
        }

        //查询指定商品的最新信息
        Product product=productDao.selectById(id);

        //取出购物车所有的明细
        List<Item> items=cart.getItems();

        //遍历明细
        for(Item item:items){
            //找到需要修该的明细
            if(item.getProduct().getId().equals(product.getId())){

                //获取原来的明细总价
                Double oldPrice=item.getPrice();

                //购物车有啥变化？？？
                // 1.明细数量=num
                item.setNum(num);

                // 2.明细总价=当前商品的单价*当前明细数量
                item.setPrice(product.getPrice()*item.getNum());

                Double newPrice=item.getPrice();

                // 3.购物车总价=原来的总价-原来的明细+现在的明细总价
                cart.setPrice(cart.getPrice()-oldPrice+newPrice);

            }
        }


    }
}
